#coding:utf-8

##
# author nanzhi<nanzhienai@163.com,http://www.12sui.cn>
# TODO 内联样式/脚本格式化
# TODO Doctype校验
# TODO 未闭合标签检查
# TODO 压缩html
##

import re,os,sys

#设置缩进大小
indent = 4

#获取文件路径
dir = sys.argv

#自闭合标签，不包含注释
selfClosureTag = re.compile(r'<(br|input|link|meta|hr|col|img|area|base|hr|embed|param)\b')

#半闭合标签
halfClosureTag = re.compile(r'p|td|li')

#不换行不留空标签
nowrapTag = re.compile(r'(h1|h2|h3|h4|h5|h6|span|a)(\/|>|\s)')

#匹配首尾标签
e2bTag = re.compile(r'>(.[^<]*)<')

#匹配所有标签
cpTag = re.compile(r'<.[^>]+>')

#匹配样式或者脚本标签
inlineS = re.compile(r'<\/*(style|script)\s*>')

#一对无内容空标签
emptyTag = re.compile(r'(<(\w+)\b.*?>)\s*\n*\r*(<\/\2>)')

#无用行
useless = re.compile(r'\r|\n')

#空行
blankline = re.compile(r'\n\s*\n+')

#空格
space = ' '

#格式化
def formatHtml(htmlStr = '', tabNum = 4):
	#如果是文件则转化为字符串
	if isinstance(htmlStr, file):
		htmlStr = ''.join(htmlStr.readlines()).decode('gb18030').encode('gb18030')

	#计数
	tab = 0
	#字符存储
	html = []
	#内联样式/脚本存储
	inline = []
	inlineCount = 0	
	#循环所有字符，确定是否添加换行或者空格
	count = 0
	while(count < len(htmlStr)):
		#无用行不进行添加
		if useless.match(htmlStr):
			count += 1
			continue
		#inline
		if inlineCount == 10:
			if inlineS.match(htmlStr[count : count + 8]):
				#TODO format style or script
				html.append(''.join(inline))
				inline = []
				inlineCount = 0
			else:
				inline.append(htmlStr[count])
				count += 1
				continue

		if inlineS.match(htmlStr[count : count + 7]) or (inlineCount > 0 and inlineCount < 10):
			if htmlStr[count] == '>':
				inlineCount = 10	
			else:
				inlineCount += 1		

		if htmlStr[count] == '<':
			html.append('\n')
			#记忆
			tempNum = tab
			if htmlStr[count + 1] == '/':
				tab -= tabNum 
				html.append(space * tab)
			elif htmlStr[count + 1] != '!' or htmlStr[count + 1 : count + 3] == '!-':
				html.append(space * tab)
				tab += tabNum 

			#自闭合标签归位
			if selfClosureTag.match(htmlStr[count : count + 6]):
				tab = tempNum

		#注释格式
		if htmlStr[count : count + 2] == '->':
			tab -= tabNum

		html.append(htmlStr[count])

		if htmlStr[count] == '>':
			html.append('\n')
			#非内联样式/脚本的时候添加缩进
			if not inlineS.search(htmlStr[count - 8 : count + 1]):
				html.append(space * tab)

		count += 1

	#去除第一行的空行
	if html[0] == '\n':
		del html[0]
	#转化为字符串
	html = ''.join(html)
	#去除空标签中的换行
	html = emptyTag.sub(r'\1\3', html, 0)
	#去除多余行
	html = blankline.sub('\n', html, 0)

	return html

#输出html
if len(dir) >= 4:
	outputHtml = formatHtml(open(dir[2],'r'), indent) 
	file = open(dir[3], 'w')
	file.write(outputHtml)
	file.close()
else:
	print 'Sorry, No file, I can\'t fly!'

#输出html
if len(dir) >= 2:
	outputHtml = formatHtml(open(dir[1],'r'), indent) 
	#输出新文件
	if len(dir) >= 3:
		#覆盖原文件
		if dir[2] == 'w':
			newFile = dir[1]
		else:
			newFile = dir[2]
	else:
		newFile = newFileName.sub(r'\1-order.', dir[1], 0)
	file = open(dir[3], 'w')
	file.write(outputHtml)
	file.close()
else:
	print 'Sorry, No file, I can\'t fly!'


#print formatHtml(open(dir,'r'), 4) 
#print formatHtml('<p>hahaha<br></p><p>222</p>')

